package apis

import (
	"errors"
	"fmt"
	_ "github.com/360EntSecGroup-Skylar/excelize"
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	_ "github.com/tealeg/xlsx"
	"go.uber.org/zap"
	"project/app/admin/models"
	"project/app/electromechanical/models/dto"
	"project/app/electromechanical/service"
	"project/common/api"
	"project/utils"
	"project/utils/app"
)

//查询学生列表
func GetStuList(c *gin.Context) {
	list := new(dto.GetStuList)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(list); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuList(list)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//通过id查询学生详情
func GetStuDetails(c *gin.Context) {
	// 获取参数 校验参数
	l := new(dto.GetStuDetails)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(l); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuDetails(l)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//通过学号查询学生
func GetStuNumber(c *gin.Context) {
	n := new(dto.GetStuNumber)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(n); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuNumber(n)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询条件列表
func GetStuLists(c *gin.Context) {
	a := new(dto.GetStuLists)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(a); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuLists(a)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询球队列表
func GetStuTeam(c *gin.Context) {
	t := new(dto.GetStuTeam)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(t); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuTeam(t)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询心里预警列表
func GetStuWarning(c *gin.Context) {
	w := new(dto.GetStuWarning)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(w); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuWarning(w)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询班委列表
func GetStuCommittee(c *gin.Context) {
	w := new(dto.GetStuCommittee)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(w); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuCommittee(w)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询党员列表
func GetStuMember(c *gin.Context) {
	w := new(dto.GetStuMember)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(w); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuMember(w)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询少数民族列表
func GetStuNation(c *gin.Context) {
	w := new(dto.GetStuNation)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(w); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuNation(w)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//查询学生会列表
func GetStuUnion(c *gin.Context) {
	w := new(dto.GetStuUnion)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(w); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.GetStuUnion(w)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//奖学金搜索
func Scholarship(c *gin.Context) {
	w := new(dto.Scholarship)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(w); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.Scholarship(w)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}
//奖学金导出
func Downscholarship(c *gin.Context) {
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.Downscholarship()
	if err != nil {
		zap.L().Error("Downscholarship service failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}

	utils.ResponseXls(c, res, `奖学金`)
}
//获奖信息导出
func Downinsegrals(c *gin.Context) {
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.Downinsegrals()
	if err != nil {
		zap.L().Error("Downinsegrals service failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}

	utils.ResponseXls(c, res, `获奖信息`)
}
//处罚信息导出
func Downnoinsegrals(c *gin.Context) {
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.Downnoinsegrals()
	if err != nil {
		zap.L().Error("Downinsegrals service failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}

	utils.ResponseXls(c,res, `处罚信息`)
}
//添加奖励
func Addpoint(c *gin.Context) {
	p := new(dto.Addpoint)

	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		return
	}

	if err := c.ShouldBindJSON(p); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("del job bind ids failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}

	stu := new(service.Stu)
	if err := stu.Addpoint(user.UserId, p); err != nil {
		zap.L().Error("add job service failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeInsertOperationFail)
		return
	}
	app.ResponseSuccess(c, nil)
}
//添加惩罚
func Delpoint(c *gin.Context) {
	p := new(dto.Delpoint)

	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		return
	}

	if err := c.ShouldBindJSON(p); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("del job bind ids failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}

	stu := new(service.Stu)
	if err := stu.Delpoint(user.UserId, p); err != nil {
		zap.L().Error("add job service failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeInsertOperationFail)
		return
	}
	app.ResponseSuccess(c, nil)
}
//删除奖励
func Deladdpoint(c *gin.Context) {
	a := new(dto.Deladdpoint)
	//获取上下文中信息
	user, err := api.GetUserMessage(c)
	if err != nil {
		zap.L().Error("GetUserMessage failed", zap.Error(err))
		app.ResponseError(c, app.CodeLoginFailReLogin)
		return
	}
	if err := c.ShouldBindQuery(a); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("job bind params failed", zap.String("Username", user.Username), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	//业务逻辑处理
	s := new(service.Stu)
	res, err := s.Deladdpoint(a)
	if err != nil {
		zap.L().Error("get job list failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeSelectOperationFail)
		return
	}
	// 返回响应
	app.ResponseSuccess(c, res)
}




//添加奖励
func Add(c *gin.Context) {
	p := new(dto.Add)
	if err := c.ShouldBindJSON(p); err != nil {
		//请求参数有误， 直接返回响应
		zap.L().Error("del job bind ids failed",  zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}
	fmt.Printf("%v\n", *p)

	stu := new(service.Stu)
	if err := stu.Add(p); err != nil {
		//zap.L().Error("add job service failed", zap.String("Username", user.Username), zap.Error(err))
		app.ResponseError(c, app.CodeInsertOperationFail)
		return
	}
	app.ResponseSuccess(c, nil)
}


//登录
func Login(c *gin.Context) {
	// 1.获取参数 校验参数
	p := new(dto.Login)
	if err := c.ShouldBindJSON(p); err != nil {
		// 请求参数有误， 直接返回响应
		zap.L().Error("Login failed", zap.String("number", p.Number), zap.Error(err))
		_, ok := err.(validator.ValidationErrors)
		if !ok {
			app.ResponseError(c, app.CodeParamIsInvalid)
			return
		}
		app.ResponseError(c, app.CodeParamNotComplete)
		return
	}

	u := new(service.Stu)
	data, err := u.Login(c, p)
	if err != nil {
		zap.L().Error("get login user info message failed", zap.String("number", p.Number), zap.Error(err))
		if errors.Is(err, models.ErrorInvalidPassword) || errors.Is(err, models.ErrorUserNotExist) {
			app.ResponseError(c, app.CodeLoginFailResCode)
			return
		} else if errors.Is(err, models.ErrorUserIsNotEnabled) {
			app.ResponseError(c, app.CodeUserIsNotEnabled)
		}
		app.ResponseError(c, app.CodeSeverError)
		return
	}

	// 3.返回响应
	app.ResponseSuccess(c, data)
}



